import axios from 'axios'
import { createUniAppAxiosAdapter } from '@uni-helper/axios-adapter'
import appConfig from '@/config/index.js'
import { useUserStore } from '@/store/user'

// 创建 axios 实例
const service = axios.create({
  // 适配器
  adapter: createUniAppAxiosAdapter(),
  // 默认地址请求地址 
  baseURL: appConfig.api_url,
  // 设置超时时间
  timeout: 60000,
  // 跨域时候允许携带凭证
  withCredentials: true,
  // 默认请求头
  headers: { "Content-Type": "application/json;charset=UTF-8", }
})

/**
 * @description 请求拦截器
 * 客户端发送请求 -> [请求拦截器] -> 服务器
 * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中
 */
service.interceptors.request.use(
  (config) => {
    // console.log('==== 请求拦截器 config :', config);
    const userStore = useUserStore()

    // 是否显示loading，默认true
    config.loading ??= true
    if (config.loading) {
      uni.showLoading({
        title: '加载中...',
      })
    }

    // 错误消息提示，toast(默认) | modal | none
    config.prompt ??= 'toast'

    // 请求头设置
    config.headers.Authorization = 'Bearer ' + userStore.token

    return config
  },
  (err) => {
    return Promise.reject(err)
  }
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // console.log('==== 响应拦截器 response :', response);
    const { data, config } = response
    const userStore = useUserStore()

    if (config?.loading) uni.hideLoading()

    if (data?.code !== 200) {
      if (config?.prompt == 'toast') {
        uni.showToast({
          title: data?.msg || data?.message || data?.errMsg?.message || data?.errMsg,
          icon: 'none',
          duration: 3000
        })
      }
      if (config?.prompt == 'modal') {
        uni.showModal({
          title: '系统提示',
          content: data?.msg || data?.message || data?.errMsg?.message || data?.errMsg,
          showCancel: false,
        })
      }
      return Promise.reject(data)
    }

    return data
  },
  (err) => {
    const { config, response, message } = err

    if (config?.loading) uni.hideLoading()

    if (config?.prompt == 'toast') {
      uni.showToast({
        title: response?.data?.message || message,
        icon: 'none',
        duration: 3000
      })
    }
    if (config?.prompt == 'modal') {
      uni.showModal({
        title: '系统提示',
        content: response?.data?.message || message,
        showCancel: false,
      })
    }

    return Promise.reject(err)
  }
)

// 导出 axios 实例
export default service